var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function (err, conn) {

    if (err) { exit(err); }
    conn.createChannel(function (err, ch) {
        if (err) { exit(err); }

        var q = 'rpc_queue';

        ch.assertQueue(q, {durable: false});
        ch.prefetch(1);
        console.log(' [x] Awaiting RPC requests');
        
        ch.consume(q, function reply(msg) {
            var n = parseInt(msg.content.toString());

            console.log(" [.] fib(%d)", n);

            var r = fibonacci1(n);
            
            ch.sendToQueue(msg.properties.replyTo, new Buffer(r.toString()), {
                correlationId: msg.properties.correlationId
            });

            ch.ack(msg);
        });
    });
});

function exit(err) {
    console.log(err);
    process.exit(1);
}

function fibonacci(n) {
    console.log(n);
    
    if (n == 0 || n == 1)
        return n;
    else
        return fibonacci(n - 1) + fibonacci(n - 2);
}

function fibonacci1(n) {
    if (n == 0 || n == 1) {
        return n;
    }

    var last = 0;
    var now = 1;

    for(i = 2; i<= n; i++) {
        // console.log(last,now);

        var temp = now;
        now += last;
        last = temp;
    }
    return now;
}